<?php

require_once __DIR__.'/../vendor/autoload.php';

/*
|--------------------------------------------------------------------------
| Load the Environment Variables
|--------------------------------------------------------------------------
|
| In docker environment, the PROD environment is directly copied from the image of the UAT environment
| and the env file cannot be modified directly, so we made three env file here
| Or you can decide whether to apply the following code as you wish
|
*/

$environ = $_SERVER['environment'] ?? 'dev';
switch ($environ) {
    case 'uat':
        $configName = '.env.uat';
        break;
    case 'prod':
        $configName = '.env.prod';
        break;
    default:
        $configName = '.env';
        break;
}

(new Laravel\Lumen\Bootstrap\LoadEnvironmentVariables(
    dirname(__DIR__), $configName
))->bootstrap();

date_default_timezone_set(env('APP_TIMEZONE', 'UTC'));

/*
|--------------------------------------------------------------------------
| Create The Application
|--------------------------------------------------------------------------
|
| Here we will load the environment and create the application instance
| that serves as the central piece of this framework. We'll use this
| application as an "IoC" container and router for this framework.
|
*/

$app = new Laravel\Lumen\Application(
    dirname(__DIR__)
);

$app->withFacades();
$app->withEloquent();

/*
|--------------------------------------------------------------------------
| Change The Default Storage Path
|--------------------------------------------------------------------------
|
| If you want to deploy this project in a docker environment
| please modify the default storage directory to avoid the original directory be destroy when the project is redistributed
| Or you can decide whether to apply the following code as you wish
|
*/

$tmp_storage = sys_get_temp_dir() . DIRECTORY_SEPARATOR . env('APP_NAME') . '-storage-' . php_sapi_name();
if (!is_dir($tmp_storage)) {
    mkdir($tmp_storage);
}
$app->useStoragePath($tmp_storage);

/*
|--------------------------------------------------------------------------
| Register Container Bindings
|--------------------------------------------------------------------------
|
| Now we will register a few bindings in the Services container. We will
| register the exception handler and the console kernel. You may add
| your own bindings here if you like or you can make another file.
|
*/

$app->singleton(
    Illuminate\Contracts\Debug\ExceptionHandler::class,
    App\Exceptions\Handler::class
);

$app->singleton(
    Illuminate\Contracts\Console\Kernel::class,
    App\Console\Kernel::class
);

/*
|--------------------------------------------------------------------------
| Register Config Files
|--------------------------------------------------------------------------
|
| Now we will register the "app" configuration file. If the file exists in
| your configuration directory it will be loaded; otherwise, we'll load
| the default version. You may register other files below as needed.
|
*/

$app->configure('app');
$app->configure('api');
$app->configure('auth');

/*
|--------------------------------------------------------------------------
| Register Middleware
|--------------------------------------------------------------------------
|
| Next, we will register the middleware with the application. These can
| be global middleware that run before and after each request into a
| route or middleware that'll be assigned to some specific routes.
|
*/

// $app->middleware([
//     App\Http\Middleware\ExampleMiddleware::class
// ]);

 $app->routeMiddleware([
     'auth' => App\Http\Middleware\Authenticate::class,
     'cors' => palanik\lumen\Middleware\LumenCors::class
 ]);

/*
|--------------------------------------------------------------------------
| Register Services Providers
|--------------------------------------------------------------------------
|
| Here we will register all of the application's Services providers which
| are used to bind services into the container. Services providers are
| totally optional, so you are not required to uncomment this line.
|
*/

// $app->register(App\Providers\AppServiceProvider::class);
$app->register(App\Providers\AuthServiceProvider::class);
// $app->register(App\Providers\EventServiceProvider::class);



$app->register(Illuminate\Redis\RedisServiceProvider::class);

$app->register(Dingo\Api\Provider\LumenServiceProvider::class);
$app->register(Tymon\JWTAuth\Providers\LumenServiceProvider::class);

// laravel-log-viewer
// $app->register(Rap2hpoutre\LaravelLogViewer\LaravelLogViewerServiceProvider::class);

/*
|--------------------------------------------------------------------------
| Load The Application Routes
|--------------------------------------------------------------------------
|
| Next we will include the routes file so that they can all be added to
| the application. This will provide all of the URLs the application
| can respond to, as well as the controllers that may handle them.
|
*/

$app->router->group([
    'namespace' => 'App\Http\Controllers',
], function ($router) {
    require __DIR__ . '/../routes/api.php';
    require __DIR__ . '/../routes/web.php';
});

return $app;
